﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GS1.Library;
using SegIdenMovil.Entidad;
using SegIdenMovil.Herramientas;
using SegIdenMovil.Delegate;

namespace SegIdenMovil
{
    public partial class frmInventarioBultos : Form
    {
        #region --- Variables y Constantes ---
        private Tienda tiendaActual = null;
        public Inventario inventario { get; set; }
        private Bulto bulto { get; set; }
 

        #endregion

        #region --- Constructor ---
        public frmInventarioBultos()
        {
            InitializeComponent();
        }
        #endregion


      
        #region --- Eventos Formulario ---

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void frmInventarioBultos_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void frmInventarioBultos_Closing(object sender, CancelEventArgs e)
        {
            activarScanner(false);
        }

        private void menuItem1_Click_1(object sender, EventArgs e)
        {
            contenido();
        }

        #endregion
        #region --- Metodo y Evento Scanner ---
        private void activarScanner(bool estado)
        {
            if (estado)
            {
                if (ParametrosAplicacion.scanner == null) { ParametrosAplicacion.scanner = new GS1.Scanner.Scan(this); }
                ParametrosAplicacion.scanner.EscanearDato += new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                ParametrosAplicacion.scanner.ActivarScan();
            }
            else
            {
                if (ParametrosAplicacion.scanner != null)
                {
                    ParametrosAplicacion.scanner.EscanearDato -= new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                    if (ParametrosAplicacion.scanner.IsActive) { ParametrosAplicacion.scanner.DesActivarScan(); }
                }
            }
        }

        private void scanner_EscanearDato(string pTipo, string pDato)
        {
            this.txtNumeroBulto.Text = pDato;
            procesarLectura();
        }
        #endregion


        #region --- Metodos Propios ---

        private void cargarFormulario()
        {

            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Mostrar descripcion de tienda
                this.lblEtiquetaTienda.Text = ParametrosAplicacion.TIENDA_ACTUAL.descripcion;

                if (tiendaActual == null)
                {
                    // Si es la primera ves que se trabaja con la tienda, se valida si tiene inventario activo
                    if (validarExistenciaInventario()) { return; }
                }

                // Se aplica estilo a listview
                //Utilitario.aplicarEstiloGrilla(this.lvwListado, this);

                // Activar Scanner
                activarScanner(true);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarExistenciaInventario()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_INVENTARIO;

            operacion.inventario = new Inventario();
            operacion.inventario.tienda = new Tienda();
            operacion.inventario.tienda.codigo = ParametrosAplicacion.TIENDA_ACTUAL.codigo;

            // Instanciando y ejecutando llamada al ServicioREST
            using (ConexionREST conexionREST = new ConexionREST())
            {
                contenidoXML = conexionREST.ejecutarOperacion(operacion);
            }

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return true;
            }

            // Obteniendo Objeto de Inventario
            this.inventario = contenidoXML.DeserializarTo<Inventario>();

            if (this.inventario == null)
            {
                // Limpiando tienda actual
                this.tiendaActual = null;

                Util.ShowMessageboxInfo("No hay ningun inventario activo para esta tienda");
                return true;
            }

            return false;
        }

        private void procesarLectura()
                {
                    Operacion operacion = null;
                    string contenidoXML = string.Empty;

                    try
                    {
                        Cursor.Current = Cursors.WaitCursor;

                        // Estableciendo operacion a ser enviada al Servicio REST
                        operacion = new Operacion();
                        operacion.numero = Constantes.OPERACION_CONSULTAR_BULTO_CONTENIDO;

                        operacion.bulto = new Bulto();
                        operacion.bulto.SSCC = this.txtNumeroBulto.Text;

                        // Instanciando y ejecutando llamada al ServicioREST
                        using (ConexionREST conexionREST = new ConexionREST())
                        {
                            contenidoXML = conexionREST.ejecutarOperacion(operacion);
                        }

                        // Obteniendo Objeto de Error
                        OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                        // Validar si hay error
                        if (operacionError != null)
                        {
                            Util.ShowMessageboxError(operacionError.descripcion);
                            return;
                        }

                        // Obtenido el Objeto Item
                        this.bulto = contenidoXML.DeserializarTo<Bulto>();

                    }
                    catch (Exception ex)
                    {
                        Util.MensajeError(ex, this.Text);
                    }
                    finally
                    {
                        Cursor.Current = Cursors.Default;
                    }
                }

        private void contenido()
        {
                    
           using (frmInventarioDetBulto frmInventarioDetBulto = new frmInventarioDetBulto())
           {

                        frmInventarioDetBulto.inventario = inventario;
                        frmInventarioDetBulto.bulto = bulto;
                        frmInventarioDetBulto.sscc = this.txtNumeroBulto.Text;
                        if (frmInventarioDetBulto.ShowDialog() == DialogResult.Cancel) { frmInventarioDetBulto.Dispose(); return; }
                        frmInventarioDetBulto.Dispose();
                        salir();
             }                  
         }

        private void salir()
        {
            this.Close();
        }
        #endregion



    }
}